#include <54func.h>
int main(int argc,char *argv[])
{
    // ./5_azhen 192.168.187,128 1234
    ARGS_CHECK(argc,3);
    
    //创建套接字
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    
    //初始化要绑定的IP地址：
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;//地址族为IPv4
    serverAddr.sin_port =htons(atoi(argv[2]));//将指定的端口先转为整数->转为网络字节序
    serverAddr.sin_addr.s_addr =inet_addr(argv[1]);//将点分十进制转换为网络地址
    
    //绑定套接字：将套接字绑定到指定的IP地址和端口上
    int ret = bind(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr));
    ERROR_CHECK(ret,-1,"bind");
    
    //监听连接：将套接字设置为监听模式，最多可以有X个未完成的连接请求在队列中等待，X主观设置
    listen(sockfd,50);//此刻服务器被动，但是能够接收来自客户端的连接请求

    //服务器创建新的套接字与客户端进行通信
    int netfd = accept(sockfd,NULL,NULL);//这里就不获取客户端的ip地址以及端口
    
    //利用select进行即使通信
    char buf[4096] = {0};
    fd_set rdset;
    while(1)
    {
        //select之前需要重置监听集合
        FD_ZERO(&rdset);
        //把引起阻塞的行为加入到监听集合中
        FD_SET(STDIN_FILENO,&rdset);
        FD_SET(netfd,&rdset);
        select(netfd+1,&rdset,NULL,NULL,NULL);
        //select返回，说明stdin or netfd就绪了，
        if(FD_ISSET(STDIN_FILENO,&rdset))
        {
            //读取stdin的数据
            bzero(buf,sizeof(buf));
            ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));//read功能很强大，可以从磁盘，标准输入中区读取数据
            if(sret == 0)//成功时，返回读取的字节数（0表示文件结束）
            {
                printf("aqiang is leaver!\n");
                break;
            }
            send(netfd,buf,strlen(buf),0);     //send本质上是write，send只能操作socket
        }
        if(FD_ISSET(netfd,&rdset))
        {
            //读取套接字的内容
            bzero(buf,sizeof(buf));
            ssize_t sret = recv(netfd,buf,sizeof(buf),0);//recv本质上就是read，但是recv只能操作socket
            
            //如果网络的另外一端断开连接，那么我这个从网络读取的这一端会一直读取0
            if(sret == 0)
            {
                printf("aqiang已经断开！\n");
                break;
            }
            printf("aqiang：%s\n",buf);
        }
    }
    return 0;
}
